package secondStage.part4.字符流;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/**
 * @ClassName: [BianMaBiao]
 * @Description: 编码表
 * @Author: [黄劲松]
 * @CreateDate: [2021-04-04]
 * @Version: [v1.0]
 */
/*
3.2编码表
基础知识:
    ●计算机中储存的信 息都是用二进制数表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果
    ●按照某种规则，将字符存储到计算机中，称为编码。反之将存储在计算机中的二进制数按照某种规则解
    析显示出来，称为解码。这里强调一下:按照A编码存储，必须按照A编码解析,这样才能显示正确的文本符号。否则就会导致乱码现象
ASCII字符集:
    ●ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):基于拉J
    字母的一电脑编码系統，用于显示现代英语，要包括控制字符(回车键、退格、换行键等)和可显字
    符(英文大小写字符、阿拉伯数字和西文符号)
    ●基本的ASCII字符集,使佣7位表示一个字符,共128字符。ASCII的扩 展字符集使用8位表示-个字符，共
    256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等
GBXXX字符集:
    ●GB2312:简体中文码表。一个小于127的字符的意义与原来相同，但两个大于127的字符连在一起时，
    就表示-一个汉字，这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、暗
    的假名等都编进去了，连在ASCII里本来就有的数字标点母都统统重新编了两个字节长的编码，这
    就是常说的"全角"字符，而原来在127号以下的那些就叫"半角”字符了
    ●GBK:最常用的中文码表。是在GB2312标准基础 上的扩展规范,使佣了双字节编码方案,共收录了
    21003个汉字,完全兼容GB2312标准，同时支持繁体汉字以及日韩汉字等
    ●GB18030:最新的中文码表。收录汉字70244个，彩多字节编码，每个字可以由1个、2个或4个字节组
    成。支持中国国内少数民族的文字，同时支持繁体汉字以及日韩汉字等
 Unicode字符集:
    ●为表达任意语言的任意字符而设计,是业界的一种标准，也称为统一 码、标准万国码。它最多使用4个字
    节的数字来表达每个字母、符号，或者文字。有三种编码方案, UTF-8、 UTF-16和UTF32。 最为常用的
    UTF- 8编码
    ●UTF-8编码: 可以用来表示Unicode标准中任意字符,它电子邮件、网页及其他存储或传送文字的应用
    中，优先采用的编码。互联网工程工作小组(IETF) 要求所有互联网协议都必须支持UTF -8编码。它使用一至四个字节 为每个字符编码
        编码规则:
            128个US-ASCI字符，只需一个字节编码
            拉丁文等字符,需要二个字节编码
            大部分常用字(含中文)，使用三个字节编码
            其他极少使用的Unicode辅助字符，使用四字节编码
 小结:采用何种规则编码，就要采用对应规则解码，否则就会出现乱码
 */
/*
3.3字符串中编码解码问题
编码:
   ●byte[ getBytesQ:使用平台的默认字符集将该String编码为-列字节,将结果存储到新的字节数组中
   ●byte[] getBytes(String charsetName):使用指定的字符集将该String编码为-系列字节,将结果存储到新的字节数组中
解码:
    ●String(byte[] bytes):过使用平台的默认字符集解码指定的字节数组来构造新的String
    ●String(byte[ bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String*/
public class BianMaBiao {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //编码
        String s = "中国";
        //平台默认字符集
        byte[] b1 = s.getBytes();
        System.out.println(Arrays.toString(b1));//[-28, -72, -83, -27, -101, -67]
        //UTF-8编码格式
        byte[] b2 = s.getBytes("UTF-8");
        System.out.println(Arrays.toString(b2));//[-28, -72, -83, -27, -101, -67]
        //采用GBK编码格式
        byte[] b3 = s.getBytes("GBK");
        System.out.println(Arrays.toString(b3));//[-42, -48, -71, -6]

        //解码
        //平台默认
        String ss1 = new String(b1);
        System.out.println(ss1);
        //UTF-8格式
        String ss2 = new String(b2,"UTF-8");
        System.out.println(ss2);
        //GBK格式
        String ss3 = new String(b3,"GBK");
        System.out.println(ss3);
    }
}
